#include "drv_tim_pwm_fan.h"

//PC6 风扇 PWM和定时器实现按键控制风扇的三个档位
void time8_init()
{
	    /* 定义初始化结构体 */
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; // 定时器时基结构体
    GPIO_InitTypeDef GPIO_InitStruct;                // GPIO初始化结构体
    TIM_OCInitTypeDef TIM_OCInitStruct;                // 定时器输出比较结构体
	
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

    /* 配置GPIOF Pin8为复用功能 */
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;       // 复用功能模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;       // 推挽输出
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;           // 选择Pin8
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度50MHz
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;       // 上拉模式
    GPIO_Init(GPIOC, &GPIO_InitStruct);               // 初始化GPIOF

    /* 将GPIOF Pin8映射到TIM13 */
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8);

    /* 配置TIM13基本参数 */
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;     // 时钟不分频
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
    TIM_TimeBaseInitStruct.TIM_Period = 50000 - 1;                 // 自动重装载值（5000个计数周期）
    TIM_TimeBaseInitStruct.TIM_Prescaler = 84 - 1;                 // 预分频系数（84分频）
    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseInitStruct);             // 初始化TIM13

    /* 配置TIM13输出比较/PWM模式 */
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;               // PWM模式1
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;       // 输出极性低
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
    TIM_OCInitStruct.TIM_Pulse = 0;                               // 初始占空比为0
    TIM_OC1Init(TIM8, &TIM_OCInitStruct);                       // 初始化通道1

    /* 使能TIM13预装载寄存器 */
    TIM_ARRPreloadConfig(TIM8, ENABLE);               // 使能自动重装载预装载
    TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); // 使能输出比较预装载
    TIM_CtrlPWMOutputs(TIM8, ENABLE);                   // 使能PWM输出

    /* 启动TIM13定时器 */
	TIM8->BDTR |= TIM_BDTR_MOE;
	TIM_CtrlPWMOutputs(TIM8, ENABLE);
    TIM_Cmd(TIM8, ENABLE);
    
}

//// 设置风扇挡位（更新PWM占空比）
void drv_fan_set_speed(uint16_t speed) {
    TIM_SetCompare1(TIM8, speed);  // 更新TIM3_CH1的比较值（CCR1）
}
